package com.itheima.ydd.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.ydd.commom.R;
import com.itheima.ydd.entity.SysMenu;
import com.itheima.ydd.service.SysMenuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/sys_menu")
public class SysMenuController {
    @Autowired
    private SysMenuService sysMenuService;

    /**
     * 修改菜单
     * @param sysMenu
     * @return
     */
    @PostMapping("/update")
    public R update(@RequestBody SysMenu sysMenu) {
        log.info("接收到的修改参数为{}", sysMenu.toString());
        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(sysMenu.getId() != null, SysMenu::getId, sysMenu.getId());
        sysMenuService.update(sysMenu, queryWrapper);
        return R.success("修改成功", "");
    }

    /**
     * 删除菜单
     * @param sysMenu
     * @return
     */
    //admin/sys_menu/del?id=175
    @GetMapping("/del")
    public R delete(SysMenu sysMenu) {
        log.info("要删除的id为{}", sysMenu.getId());

        //查询菜单的default_data是否为1,如果是则为默认设置,不能删除
        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(sysMenu.getId() != null, SysMenu::getId, sysMenu.getId());
        SysMenu sysMenu_find = sysMenuService.getOne(queryWrapper);
        if (sysMenu_find.getDefaultData() != null && sysMenu_find.getDefaultData().equals("1")) {
            return R.error("系统默认数据，不允许删除");
        }

        //查询是否含有子级,如果有,则不能删除
        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysMenu::getPid,sysMenu_find.getId());
        wrapper.eq(SysMenu::getDelFlag,0);
        SysMenu sysMenu_find2 = sysMenuService.getOne(wrapper);
        if (sysMenu_find2!=null){
            return R.error("含有子级,不能删除");
        }

        //不是默认设置,也没有子级,可以删除,删除是把对应的删除标记设为1
        sysMenu.setDelFlag(1);
        sysMenuService.update(sysMenu,queryWrapper);

        return R.success("删除成功", "");
    }

    /**
     * 添加
     * sys_menu/add
     * @param sysMenu
     * @return
     */
    @PostMapping("/add")
    public R add(@RequestBody SysMenu sysMenu){
        log.info("添加的菜单为{}",sysMenu.toString());
        //如果权限标识已存在,则不能添加
       // sysMenu.setId(1234);
        sysMenuService.save(sysMenu);

        return R.success("添加成功","");
    }

    /**
     * 查询所有菜单数据
     * @return
     */
    @GetMapping("/allData")
    public R getALl(){
        LambdaQueryWrapper<SysMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        //父标记是0,一级目录
        lambdaQueryWrapper.eq(SysMenu::getPid,0);
        //删除标记是零,没有删除
        lambdaQueryWrapper.eq(SysMenu::getDelFlag,0);
        //按照排序,更新时间和创建时间降序排列
        lambdaQueryWrapper.orderByDesc(SysMenu::getSort).orderByDesc(SysMenu::getUpdateDate).orderByDesc(SysMenu::getCreateDate);
        List<SysMenu> data = sysMenuService.list(lambdaQueryWrapper);
        for (SysMenu sysMenu : data) {
            diGuiGet(sysMenu);
        }
        return R.success("",data);
    }

    /**
     * 递归查询菜单的方法
     * @param sysMenu
     * @return
     */
    public SysMenu diGuiGet(SysMenu sysMenu){
        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SysMenu::getPid,sysMenu.getId());
        //删除标记是零,没有删除
        wrapper.eq(SysMenu::getDelFlag,0);
        //按照更新时间和创建时间降序排列
        wrapper.orderByDesc(SysMenu::getUpdateDate).orderByDesc(SysMenu::getCreateDate);
        List<SysMenu> list = sysMenuService.list(wrapper);
        sysMenu.setChildren(list);
        for (SysMenu menu : list) {
            diGuiGet(menu);
        }
        return sysMenu;
    }

    /**
     * 查询单个,详情
     * sys_menu/rowInfo?id=1234
     * @param id
     * @return
     */
    @GetMapping("/rowInfo")
    public R getOne(Integer id){
        LambdaQueryWrapper<SysMenu> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(id!=null,SysMenu::getId,id);
        SysMenu sysMenu = sysMenuService.getOne(wrapper);
        return R.success("",sysMenu);
    }
}
